<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        //多层对象或者数组如何深拷贝?
        // function deepCopy(obj1) {
        //     //精确判断
        //     var obj2 = Object.prototype.toString.call(obj1) === "[object Array]" ? [] : {};
        //     for (var key in obj1) {
        //         /* 分两种情况处理: 
        //             简单数据类型  直接赋值给新的 obj2 
        //             复杂数据类型  要重新生成一个地址,定义一个数组或对象    
        //         */

        //         //  Object.hasOwnProperty(key)    判断循环出来的属性是否是自身属性,不需要处理原型及原型链上的属性和方法
        //         //解决了  for in 的弊端 :循环对象 ,可以循环原型链
        //         if (obj1.hasOwnProperty(key)) {
        //             //判断内部层次数据 的数据类型  是复杂数据类型 还是简单数据类型
        //             if (typeof obj1[key] === "object") {
        //                 //复杂数据类型  数组或对象 就调用方法
        //                 obj2[key] = deepCopy(obj1[key]);
        //             } else {
        //                 //直接赋值
        //                 obj2[key] = obj1[key];
        //             }
        //         }
        //     }
        //     return obj2;
        // }

        // var obj1 = {
        //     name: "张三",
        //     age: 20,
        //     hobby: {
        //         name1: "篮球",
        //         name2: "足球"
        //     }
        // }
        // var obj2 = deepCopy(obj1);
        // console.log(obj2); /* hobby: {name1: '乒乓球', name2: '足球'},name: "张三",age:20 */
        // obj2.hobby.name1 = "乒乓球";
        // console.log(obj1); /* hobby: {name1: '篮球', name2: '足球'},name: "张三",age:20 */
        // console.log(obj2); /* hobby: {name1: '乒乓球', name2: '足球'},name: "张三",age:20 */




        /* constructor 判断数据类型: 某个实例是否是某个构造器构造出来的 */
        function Person(name, age) {
            this.name = name;
            this.age = age;
        }
        let zhangsan = new Person("张三", 20);
        if (zhangsan.constructor === Person) {
            console.log("张三对象是Person构造出来的");
        } else {
            console.log("不是");
        }
        var arr = [1, 2, 3];
        var obj = {};
        if (obj.constructor === Array) {
            console.log("数组");
        } else {
            console.log("不是数组");
        }
        console.log(arr.constructor === Array);//true
        console.log(arr.constructor === Object);//false
        console.log(typeof arr === "object");//true
    </script>
</body>

</html>